package org.germinus.cardea.MuleServiceBundle.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import models_bundle.Location;
import models_bundle.MedicineUnit;
import ocp.context.Attribute;
import ocp.context.AttributeDefinition;
import ocp.context.Context;
import ocp.context.ContextClass;
import ocp.context.ContextualInformation;
import ocp.context.ContextualInformationAbsentException;
import ocp.context.ContextualInformationList;
import ocp.context.SimpleContext;


/**
 * Encapsula un contexto de tipo Medicamento. Permite leer los atributos
 * del contexto de una manera directa. Existen dos formas de crear la clase:
 * 1. A partir de los atributos tagId, nombre...
 * 2. A partir de un contexto de clase Context ya creado
 * 
 * @author Paco López Mármol
 */
public class MedicineContext  {
    //public static final String FECHA_FORMATO = "yyyy-MM-dd'T'HH:mm:ss";
    public static final String FECHA_FORMATO = "yyyy-MM-dd";
    // contexto
    private SimpleContext context = null; 
    // taqID del medicamento

    private Integer medicineId;
    
    private String tagId; 
    // Nombre del medicamento
    private String name;  
    // Localización
    private String localization; 
    // fecha de caducidad
    private Date caducityDate;
    // fecha de etiquetado
    private Date registerDate;
    // fechas en string
       

  
    // fecha de caducidad
    //private Date caducityDate;
    // fecha de etiquetado
    //private Date registerDate;
    

    public MedicineContext(MedicineUnit medicine , Location location) {
    	medicineId = medicine.getID();
    	name = medicine.getMedicineName();
    	registerDate = medicine.getRegisterDate();
    	caducityDate = medicine.getCaducityDate();
    	tagId = medicine.getTag().getTagID();
    	localization = location.getReaderIP()+"["+location.getAntenna()+"]";
    	
    	try {
    		context = new SimpleContext("Medicine-"+medicineId+"("+name +")",
    									"Medicine-"+medicineId+"("+name +")");
    		ContextClass contextClass = new ContextClass("Location Context");
    		contextClass.setHistorical(true);
    		//Attrs
   		 SimpleDateFormat sdf = new SimpleDateFormat( FECHA_FORMATO);

    		Hashtable<String, Object> attributesMap = new Hashtable<String, Object>();
    		Attribute attMedicineName = new Attribute(new AttributeDefinition("Name", String.class), name);
    		Attribute attTagId        = new Attribute(new AttributeDefinition("TagId", String.class), tagId);
    		Attribute attMedicineId   = new Attribute(new AttributeDefinition("Id"	, String.class   ), String.valueOf(medicineId));
    		Attribute attLocalization = new Attribute(new AttributeDefinition("Localization", String.class), localization);
    		Attribute attRegisterDate = new Attribute(new AttributeDefinition("RegisterDate", String.class), sdf.format(registerDate));
    		Attribute attCaducityDate = new Attribute(new AttributeDefinition("CaducityDate", String.class), sdf.format(caducityDate));
    		attributesMap.put("Name", 		  attMedicineName);
    		attributesMap.put("TagId",	      attTagId);
    		attributesMap.put("Id",		      attMedicineId);    		
    		attributesMap.put("Localization", attLocalization);
//    		System.out.println("Register date:" + attRegisterDate);
    		attributesMap.put("RegisterDate", attRegisterDate);
  //  		System.out.println("Caducity date:" + attCaducityDate);
    		attributesMap.put("CaducityDate", attCaducityDate);
    		
    		ContextualInformation contextInfo = new ContextualInformation(
    				contextClass,"Medicine-"+medicineId+"("+name +")", "", attributesMap, new Vector() );
    		ContextualInformationList cil = new ContextualInformationList();
    		cil.addContextualInformation(contextInfo);
    		context.addContextualInformationList(cil);
    	}
    	catch (Exception e) {
    		e.printStackTrace();
		}
    }
    public MedicineContext(Context context){
    	this.context = (SimpleContext)context;
    	try {
            Enumeration<ContextualInformation> contextInfoEnum = context.getContextualInformation().getContextualInformation();
            // Navega por los atributos del contexto
            while ( contextInfoEnum.hasMoreElements())  {
                ContextualInformation ci = contextInfoEnum.nextElement();
                if (ci != null) {
                    Enumeration<Attribute> ca = ci.getAttributes();
                    while (ca.hasMoreElements()) {
                        Attribute attribute = ca.nextElement();
                        String attributeName = attribute.getAttributeDefinition().getName();
                        // Carga los campos de la clase con los valores de los atributos
                        if( attributeName.equals("Name") )  {
                            name = new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("Id") )  {
                            medicineId= Integer.parseInt( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("Localization") )  {
                            localization= new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("TagId") )  {
                            tagId = new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("CaducityDate") )  {
                            try {
								caducityDate = new SimpleDateFormat( FECHA_FORMATO ).parse(attribute.getValue().toString()) ;
							} catch (ParseException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}                            
                        }
                        else if( attributeName.equals("RegisterDate") )  {
                            try {
								registerDate =  new SimpleDateFormat( FECHA_FORMATO ).parse(attribute.getValue().toString()) ;
							} catch (ParseException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
                        }                        
                    }
                }  // ci != null
            } // end - for
        } catch (ContextualInformationAbsentException ex) {
            Activator.log("Contextual Information Not found");
        }
    }

    /**
     * Muestra los datos del contexto de tipo Medicamento
     * @param prefijo Prefijo para poner al principio de cada linea
     * @param title Titulo a mostrar
     */
    public void printContext(String prefijo,String title){
        
        System.out.println( prefijo + "----------------- " + title + " -----------------");
        System.out.println( prefijo + "Name: " + context.getName());
        System.out.println( prefijo + "Id: " + context.getId());
        System.out.println( prefijo + " nombre: " + name );
        System.out.println( prefijo + " localizacion: " + localization );
        System.out.println( prefijo + " tagId: " + tagId );
        System.out.println( prefijo + " fCaducidad: " + caducityDate );
        System.out.println( prefijo + " fEtiquetado: " + registerDate );
                
    }
    

    /**
     * Obtiene el contexto 
     * @return el contexto simple
     */
    public SimpleContext getContext() {
        return context;
    }

    /**
     * Obtiene el atributo tagId
     * @return tagId
     */
    public String getTagId() {
        return tagId;
    }
    
    /**
     * Obtiene el id del contexto que encapsula
     * @return el id del contexto
     */
    public String getContextId() {
        return context.getId();
    }

    /**
     * Obtiene el atributo nombre 
     * @return nombre del medicamento
     */ 
    public String getName() {
        return name;
    }

    /**
     * Obtiene la localización
     * @return localizacion
     */
    public String getLocalizacion() {
        return localization;
    }

  
    /**
     * Obtiene la fecha de caducidad
     * @return la fecha 
     */
    public Date getCaducityDate() {
        return caducityDate;
    }

    /**
     * Obtiene la fecha de etiquetado
     * @return la fecha 
     */
    public Date getRegisterDate() {
        return registerDate;
    }

}

